/**
 * 此文件是一个路由文件，用来设置路由匹配关系
 */
// 1. 引入模块
import Vue from 'vue';
import VueRouter from 'vue-router';
import store from '@/store';
import routes from './routes';
// 2. 创建路由实例
Vue.use(VueRouter);

// 原型上修改push方法
const originPush = VueRouter.prototype.push; // 先将之前的存储到一个变量当中
const originReplace = VueRouter.prototype.replace; // 同上

// 修改VueRouter原型上的push 用于解决重复跳转时报错的问题
VueRouter.prototype.push = function (location, okCallBack, errCallBack) {
  if (okCallBack === undefined && errCallBack === undefined) {
    // 上面的判断成立的话，表示没有传递这两个参数
    originPush.call(this, location).catch(() => {}); // 统一处理报错的问题 一劳永逸
  } else {
    originPush.call(this, location, okCallBack, errCallBack);
  }
};

VueRouter.prototype.replace = function (location, okCallBack, errCallBack) {
  if (okCallBack === undefined && errCallBack === undefined) {
    // 上面的判断成立的话，表示没有传递这两个参数
    originReplace.call(this, location).catch(() => {}); // 统一处理报错的问题 一劳永逸
  } else {
    originReplace.call(this, location, okCallBack, errCallBack);
  }
};
// 3. 书写路由规则  router是路由对象 相当于是一个物件 类似于路由器那个硬件
const router = new VueRouter({
  mode: 'history',
  // routes 加了s了是一个复数形式 表示是多个路由规则对象 相当于是路由器硬件上的网口
  routes,
  scrollBehavior(to, from, savedPosition) {

    // console.log(to,from)
    // to from表示两个路由规则对象,to要去的路由规则对象 ,from表示来自于某个路由规则对象
    // console.log(savedPosition) // 记录之前页面的滚动位置 要通过浏览器的前进或是后退按钮来触发时使用
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }
});
// 白名单中的内容是不需要进行登陆就能访问的页面
const whiteList = [
  'home',
  'search',
  'detail',
  'login',
  'register',
  'addCartSuccess',
  'shopCart'
]

// 添加路由全局前置导航守卫  也就是说只要组件一跳转就会先走这个里面的逻辑
router.beforeEach((to, from, next) => {
  // to  要去的路由组件
  // from  从哪个路由组件过来
  // next  表示放行  给一个正确的跳转目标地址才会放行
  // 如果用户要访问的页面是白名单里面的，或是已经登陆过了，都需要放行，否则先要进行登陆
  if (whiteList.includes(to.name) || store.state.user.userInfo.token) return next()

  // 如果没有在白名单里面,则需要先登陆 如果没有登陆的话，则需要先跳转到登陆页面
  // 为了有一个更好的用户体验，在用户登陆完成之后，最好是直接跳转到之前要访问的页面
  next({
    name: 'login',

    // 下面这行代码 是记录一下用户想访问的页面
    query: {
      redirect:to.path
    }
  })
})

// 4. 导出路由对象
export default router;
